package br.com.fiap.sas.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import br.com.fiap.sas.bean.Favorecido;
import br.com.fiap.sas.bean.FavorecidoFrm;
import br.com.fiap.sas.factory.ConnectionFactory;

public class FavorecidoDAO {
	
public static List<Favorecido> getFavorecidosCorrentistaDao(Integer codigoCorrentista, Integer codigoContaPai) throws SQLException {
		
		Connection conn = ConnectionFactory.getConnection();
		String sql = "select codigo, nome, numero_banco, numero_agencia, numero_conta " +
				"from favorecido " +
				"where codigo_correntista=? " +
				"union all " +
				"select ac.codigo,c.nome,'720', ac.numero_agencia,ac.numero_conta " +
				"from agencia_conta ac " +
				"inner join correntista c on ac.codigo_correntista=c.codigo " +
				"where codigo_conta_pai=?";
		
		PreparedStatement stmt = conn.prepareStatement(sql);
		stmt.setInt(1, codigoCorrentista);
		stmt.setInt(2, codigoContaPai);
		ResultSet rs = stmt.executeQuery();
	
		List<Favorecido> favorecidos = new ArrayList<Favorecido>();		
		while(rs.next()){
			Favorecido favorecido = new Favorecido();
			favorecido.setCodigo(rs.getInt("codigo"));
			favorecido.setNome(rs.getString("nome"));
			favorecido.setNumeroBanco(rs.getString("numero_banco"));
			favorecido.setNumeroAgencia(rs.getString("numero_agencia"));
			favorecido.setNumeroConta(rs.getString("numero_conta"));
			favorecido.setCodigoCorrentista(codigoCorrentista);
			favorecidos.add(favorecido);
		}
		stmt.close();
		rs.close();
		conn.close();
		return favorecidos;
	}

public static Integer getCodigoInterno(String agencia, String conta) throws SQLException {
	
	Connection conn = ConnectionFactory.getConnection();
	
	Integer codigoInterno=0;
	
	String sql = "select codigo from agencia_conta where numero_agencia=? and numero_conta=? limit 1";
	
	PreparedStatement stmt = conn.prepareStatement(sql);
	stmt.setString(1, agencia);
	stmt.setString(2, conta);
	ResultSet rs = stmt.executeQuery();	
	
	if(rs.next()){
		codigoInterno=rs.getInt("codigo");
	}
	
	stmt.close();
	rs.close();
	conn.close();
	return codigoInterno;
}	
	
public static boolean atualizarFavorecido(Favorecido f) throws SQLException{
	
	   boolean update = false;
	
	   Connection conn = ConnectionFactory.getConnection();
	
	   String sql = "update favorecido set nome=?, numero_conta=?, numero_agencia=?, numero_banco=? where codigo = ?";				
	   PreparedStatement stmt = conn.prepareStatement(sql);
	
	   stmt.setString(1, f.getNome());
	   stmt.setString(2, f.getNumeroConta());
	   stmt.setString(3, f.getNumeroAgencia());
	   stmt.setString(4, f.getNumeroBanco());		
	   stmt.setInt(5, f.getCodigo());
	   stmt.executeUpdate();			
	   conn.close();		
	   update = true;
	
	   return update;
}	

public static boolean incluirFavorecido(FavorecidoFrm f, Integer codigo_correntista) throws SQLException{
	
	boolean insert = false;
	
	Connection conn = ConnectionFactory.getConnection();
	
	String sql = "insert into favorecido (codigo_correntista, nome, numero_conta, numero_agencia, numero_banco) values (?, ?, ?, ?, ?)";	
	
	PreparedStatement stmt = conn.prepareStatement(sql);		
	stmt.setInt(1, codigo_correntista);
	stmt.setString(2, f.getNome());
	stmt.setString(3, f.getNumeroConta());
	stmt.setString(4, f.getNumeroAgencia());
	stmt.setString(5, f.getNumeroBanco());		
	stmt.executeUpdate();
		
	conn.close();		
	insert = true;
	return insert;
}	

public static boolean deleteFavorecido(Integer codigo_favorecido) throws SQLException{
	
	boolean delete = false;
	
	Connection conn = ConnectionFactory.getConnection();
	
	String sql = "delete from favorecido where codigo = ?";				
	PreparedStatement stmt = conn.prepareStatement(sql);
				
	stmt.setInt(1, codigo_favorecido);
	stmt.executeUpdate();			
	conn.close();		
	delete = true;

	return delete;
}

public static List<Favorecido> getFavorecidosDao(Integer codigo_correntista) throws SQLException {
	
		Connection conn = ConnectionFactory.getConnection();
	
		String sql = "select codigo, nome, numero_banco, numero_agencia, numero_conta from favorecido where codigo_correntista = ? order by nome";
		
		PreparedStatement stmt = conn.prepareStatement(sql);	
		stmt.setInt(1, codigo_correntista);
		ResultSet rs = stmt.executeQuery();
	
		ArrayList<Favorecido> favorecidos = new ArrayList<Favorecido>();		
		
		while(rs.next()){
			
			Favorecido favorecido = new Favorecido();
			favorecido.setCodigo(rs.getInt("codigo"));
			favorecido.setNome(rs.getString("nome"));
			favorecido.setNumeroBanco(rs.getString("numero_banco"));
			favorecido.setNumeroAgencia(rs.getString("numero_agencia"));
			favorecido.setNumeroConta(rs.getString("numero_conta"));
			favorecidos.add(favorecido);
		}
		
		stmt.close();
		rs.close();
		conn.close();
		return favorecidos;
	}

public static Favorecido getFavorecido(Integer codigo) throws SQLException {
	
		Connection conn = ConnectionFactory.getConnection();
		
		String sql = "select codigo,nome, numero_banco, numero_agencia, numero_conta, codigo_correntista from favorecido where codigo = ?";
		
		PreparedStatement stmt = conn.prepareStatement(sql);	
		stmt.setInt(1, codigo);
		ResultSet rs = stmt.executeQuery();
	
		Favorecido favorecido = null;
		
		if(rs.next()){
			favorecido = new Favorecido();
			favorecido.setCodigo(rs.getInt("codigo"));
			favorecido.setNome(rs.getString("nome"));
			favorecido.setNumeroBanco(rs.getString("numero_banco"));
			favorecido.setNumeroAgencia(rs.getString("numero_agencia"));
			favorecido.setNumeroConta(rs.getString("numero_conta"));
			favorecido.setCodigoCorrentista(rs.getInt("codigo_correntista"));
			}
		
		stmt.close();
		rs.close();
		conn.close();
		return favorecido;
	}
	public static Favorecido getFavorecido(Integer codigo, Integer codigoCorrentista) throws SQLException {
		
		Connection conn = ConnectionFactory.getConnection();
		
		String sql = "select codigo,nome, numero_banco, numero_agencia, numero_conta, codigo_correntista from favorecido where codigo = ? and codigo_correntista=?" +
				"union all " +
				"select ac.codigo,c.nome,'720', ac.numero_agencia,ac.numero_conta, ac.codigo_correntista " +
				"from agencia_conta ac " +
				"inner join correntista c on ac.codigo_correntista=c.codigo " +
				"where codigo_conta_pai=? and ac.codigo=?";
		
		PreparedStatement stmt = conn.prepareStatement(sql);	
		stmt.setInt(1, codigo);
		stmt.setInt(2, codigoCorrentista);
		stmt.setInt(3, codigoCorrentista);
		stmt.setInt(4, codigo);
		ResultSet rs = stmt.executeQuery();
	
		Favorecido favorecido = null;
		
		if(rs.next()){
			favorecido = new Favorecido();
			favorecido.setCodigo(rs.getInt("codigo"));
			favorecido.setNome(rs.getString("nome"));
			favorecido.setNumeroBanco(rs.getString("numero_banco"));
			favorecido.setNumeroAgencia(rs.getString("numero_agencia"));
			favorecido.setNumeroConta(rs.getString("numero_conta"));
			favorecido.setCodigoCorrentista(rs.getInt("codigo_correntista"));
			}
		
		stmt.close();
		rs.close();
		conn.close();
		return favorecido;
	}
}